package gdf

import (
	"gitee.com/liumou_site/logger"
	"github.com/spf13/cast"
	"strconv"
	"time"
)

// resultProcess 负责处理各个协程下载资源的结果， 若成功则从下载列表中剔除，否则重新将该任务Put到任务列表中；超过5秒便会停止
func (controller *DownloadThreadController) resultProcess(trunkSize int) string {
	// 负责处理各个协程下载资源的结果， 若成功则从下载列表中剔除，否则重新将该任务Put到任务列表中；超过5秒便会停止
	MaxRetryTime := 100
	nowRetryTime := 0
	resultMsg := ""
	for {
		select {
		case resultInfo := <-controller.DownloadResultInfoChan:
			<-controller.TaskCount    // 取出一个计数器，表示一个协程已经完成
			if resultInfo.Successes { // 成功下载该文件，清除文件名列表中的信息
				delete(controller.RangeStrs, resultInfo.RangeIndex) // 删除任务队列中的该任务（rangeStr队列）
				br := cast.ToString(strconv.FormatFloat((1.0-float64(len(controller.RangeStrs))/float64(trunkSize))*100, 'f', 2, 64))
				logger.Info("\rDownloading "+controller.DownloadFileName+" Progress:  %s", br+"%")
				if len(controller.RangeStrs) == 0 {
					resultMsg = "SUCCESSES"
					break
				}
			} else {
				nowRetryTime += 1
				if nowRetryTime > MaxRetryTime { // 超过最大的重试次数退出下载
					resultMsg = "MAX_RETRY"
					break
				}
				task := DownloadTask{customFunc: controller.downloadFiles, paramsInfo: resultInfo} // 重新加载该任务
				go controller.put(task)
			}
		case task := <-controller.TaskQueue:
			function := task.customFunc
			go function(task.paramsInfo)
		case <-time.After(5 * time.Second):
			resultMsg = "TIMEOUT"
			break
		}
		if resultMsg == "MAX_RETRY" {
			logger.Error("\nThe network is unstable, exceeding the maximum number of downloads.")
			break
		} else if resultMsg == "SUCCESSES" {
			logger.Info("\nDownload file success!")
			break
		} else if resultMsg == "TIMEOUT" {
			logger.Error("\nDownload timeout!")
			break
		}
	}

	close(controller.TaskCount)
	close(controller.TaskQueue)
	close(controller.DownloadResultInfoChan)
	return resultMsg
}
